home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy005 / lowlevel / trian4.asm < prev    next >
Encoding:
Assembly Source File  |  1997-08-13  |  10.4 KB  |  282 lines

  1. ;;; PROGRAMA en assembler para comprobar la subrutina de dibujado rápido
  2. ;;; de triangulos rellenos        -->   Navi / PhyMosys
  3. .MODEL SMALL
  4. .STACK
  5. .386
  6.  
  7. LOCALS @@
  8. w EQU WORD PTR
  9. b EQU BYTE PTR
  10. d EQU DWORD PTR
  11.  
  12. .CODE
  13. ; INCLUDE GRFLIB.INC
  14.  
  15. Save1   DD      0
  16. kk dw 0
  17.  
  18. FillTriangle    PROC
  19.                 PUSHAD
  20.                 PUSH    ES
  21.                 MOV     AX, DS:[BX+2]   ;  Pillamos y1
  22.                 CMP     AX, DS:[BX+6]
  23.                 JB    @@Cont1           ;  y1<y2 ?
  24.                 JE    @@Iguales1
  25.                 XCHG    AX, DS:[BX+6]
  26.                 MOV     DX, DS:[BX+0]
  27.                 MOV     DS:[BX+2], AX
  28.                 XCHG    DX, DS:[BX+4]
  29.                 MOV     DS:[BX+0], DX   ;  Cambio realitzado.
  30.                 JMP   @@Cont1
  31.         @@Iguales1:
  32.                 INC     w DS:[BX+6]     ;  Fuera las divisiones por 0.
  33.  
  34.       @@Cont1:  MOV     AX, DS:[BX+2]   ;  y1
  35.                 CMP     AX, DS:[BX+10]
  36.                 JB    @@Cont2           ;  y1<y3 ?
  37.                 JE    @@Iguales2
  38.                 XCHG    AX, DS:[BX+10]
  39.                 MOV     DX, DS:[BX+0]
  40.                 MOV     DS:[BX+2], AX
  41.                 XCHG    DX, DS:[BX+8]
  42.                 MOV     DS:[BX+0], DX   ;  Cambio realitzado.
  43.                 JMP   @@Cont2
  44.         @@Iguales2:
  45.                 INC     w DS:[BX+10]    ;  Fuera las divisiones por 0.
  46.  
  47.       @@Cont2:  MOV     AX, DS:[BX+6]   ;  y2
  48.                 CMP     AX, DS:[BX+10]
  49.                 JB    @@Cont3           ;  y2<y3 ?
  50.                 JE    @@Iguales3
  51.                 XCHG    AX, DS:[BX+10]
  52.                 MOV     DX, DS:[BX+4]
  53.                 MOV     DS:[BX+6], AX
  54.                 XCHG    DX, DS:[BX+8]
  55.                 MOV     DS:[BX+4], DX   ;  Cambio realitzado.
  56.                 JMP   @@Cont3
  57.         @@Iguales3:
  58.                 INC     w DS:[BX+6]     ;  Fuera las divisiones por 0.
  59.  
  60.       @@Cont3:  MOV     BP, BX
  61.                 MOV     AX, 0A000h
  62.                 MOV     ES, AX          ;  Segmento de video de la VGA
  63.  
  64.         ;  Inicialitzación de variables.
  65.  
  66.                 MOVZX   EDI, w DS:[BP+2]
  67.                 MOV     EAX, EDI
  68.                 SHL     EDI, 6          ;  EDI * 64
  69.                  MOVZX   ESI, w DS:[BP+6];  Calculamos ESI paralelamente
  70.                 SHL     EAX, 8          ;  EAX * 256
  71.                  SHL     ESI, 6+7        ;  ESI * 64 y a fixed point
  72.                 MOVZX   EBX, w DS:[BP+0];  Cargamos la x1
  73.                 ADD     EDI, EAX        ;  EDI * 320
  74.                  MOV     EAX, ESI
  75.                 ADD     EDI, EBX        ;  EDI -> y1 * 320 + x1
  76.                  SHL     EAX, 8+7-(6+7)  ;  EAX * 256 y a fixed point (ya hecho)
  77.                 SAL     EDI, 7          ;  Pasamos a punto fijo
  78.                  ADD     ESI, EAX        ;  EDI -> y2 * 320
  79.  
  80.                 MOV     AX, w DS:[BP+0]
  81.                 MOV     BX, w DS:[BP+2]
  82.                 SUB     AX, w DS:[BP+8] ;  AX = x1 - x3
  83.                 SUB     BX, w DS:[BP+10];  BX = y1 - y3
  84.                 MOVSX   EAX, AX
  85.                 MOVSX   EBX, BX         ;  Solo la WORD de bajo.
  86.                 SAL     EAX, 7+7        ;  +7 para la próxima división.
  87.                 SAL     EBX, 7          ;  Pasamos a fixed point.
  88.                 XOR     EDX, EDX
  89.                 OR      EAX, EAX
  90.                 JNS   @@Ok2             ;  El signo de EDX es muy importante.
  91.                 DEC     EDX
  92.          @@Ok2: IDIV    EBX             ;  En EAX el resultado.
  93.                 MOV     CS:[Save1], EAX ;  Para dentro de un buen ratito :)
  94.                 MOV     ECX, EAX        ;  Guardamos el resultado para después.
  95.                 ADD     EAX, 320*128    ;  EAX = EAX + 320 (en fixed)
  96.                 MOV     EBX, EAX
  97.  
  98.                 PUSH    EBX
  99.                 MOV     AX, w DS:[BP+4]
  100.                 MOV     BX, w DS:[BP+6]
  101.                 SUB     AX, w DS:[BP+0] ;  AX = x2 - x1
  102.                 SUB     BX, w DS:[BP+2] ;  BX = y2 - y1
  103.                 MOVSX   EAX, AX
  104.                 MOVSX   EBX, BX         ;  Solo la WORD de bajo.
  105.                 SAL     EAX, 7+7        ;  +7 para la próxima división.
  106.                 SAL     EBX, 7          ;  Pasamos a fixed point.
  107.                 XOR     EDX, EDX
  108.                 OR      EAX, EAX
  109.                 JNS   @@Ok3             ;  El signo de EDX es muy importante.
  110.                 DEC     EDX
  111.          @@Ok3: IDIV    EBX             ;  En EAX el resultado.
  112.                 SUB     EAX, ECX        ;  ECX lo habiamos calculado antes.
  113.                 JNS   @@Positivo        ;  Si el signo es (-) cambiarlo.
  114.                 NEG     EAX
  115.     @@Positivo: MOV     EDX, EAX        ;  Ya está calculado EDX!
  116.                 POP     EBX
  117.  
  118.                 XOR     ECX, ECX        ;  El ECX (chantatachan... >8-D )
  119.                 MOV     w CS:[OverW1], 9090h  ;  Insertamos 2 NOPs
  120.                 MOV     AX, DS:[BP+4]
  121.                 CLD                     ;  Hacia la derecha... :(
  122.                 MOV     w CS:[OverW2], 9090h
  123.                 CMP     AX, DS:[BP+0]   ;  x2>x1 ?
  124.                 JA    @@Ok1
  125.                 MOV     w CS:[OverW1], 0CF29h  ; CF29h -> SUB DI,CX
  126.                 MOV     w CS:[OverW2], 0CF29h
  127.  
  128.         ;  El primer bucle.
  129.  
  130.        @@Ok1:   MOVZX   AX, b DS:[BP+12];  Pillamos el color.
  131.                 MOV     AH, AL
  132.                 SHL     EAX, 16
  133.                 MOVZX   AX, b DS:[BP+12]
  134.                 MOV     AH, AL
  135.  
  136.      @@BucleW1: CMP     EDI, ESI
  137.                 JNB   @@FinBucle1       ;  Hasta que EDI>=ESI
  138.  
  139.                 PUSH    EDI             ;  Tenemos que guardar estos registros.
  140.                 PUSH    ECX
  141.                 SHR     ECX, 7
  142.                 SHR     EDI, 7
  143.         OverW1: NOP                     ;  2*NOP / SUB DI,CX
  144.                 NOP
  145.                 SHR     CX, 1
  146.                 JNC   @@NoDoble1
  147.                 STOSB
  148.     @@NoDoble1: SHR     CX, 1
  149.                 JNC   @@NoDoble1b
  150.                 STOSW
  151.     @@NoDoble1b:REP  STOSd              ;  Dibujamos 1 línea horizontal.
  152.                 POP     ECX
  153.                 POP     EDI
  154.  
  155.                 ADD     EDI, EBX        ;  Incrementamos valores
  156.                 ADD     ECX, EDX
  157.                 JMP   @@BucleW1
  158.         @@FinBucle1:
  159.  
  160.         ;  Re-inicialitzación de las variables.
  161.  
  162.                 PUSH    EBX
  163.                 MOV     AX, w DS:[BP+4]
  164.                 MOV     BX, w DS:[BP+6]
  165.                 SUB     AX, w DS:[BP+8] ;  AX = x2 - x3
  166.                 SUB     BX, w DS:[BP+10];  BX = y2 - y3
  167.                 MOVSX   EAX, AX
  168.                 MOVSX   EBX, BX         ;  Solo el WORD de bajo
  169.                 SAL     EAX, 7+7        ;  +7 para la próxima división.
  170.                 SAL     EBX, 7          ;  Pasamos a fixed point.
  171.                  MOVZX   ESI, w DS:[BP+10]
  172.                 XOR     EDX, EDX
  173.                 OR      EAX, EAX
  174.                 JNS   @@Ok4             ;  El signo de EDX es muy importante.
  175.                 DEC     EDX
  176.          @@Ok4: IDIV    EBX             ;  En EAX el resultado
  177.                  SHL     ESI, 6+7         ;  ESI * 64 y a fixed point.
  178.                 MOV     EDX, EAX
  179.                  MOV     EAX, ESI
  180.                 SUB     EDX, CS:[Save1] ;  El 'save' lo habiamos calculado antes
  181.                 JNS   @@Positivo2       ;  Si el signo es (-) cambiarlo.
  182.                 NEG     EDX             ;  Ya está re-calculado EDX!
  183.     @@Positivo2: SAL     EAX, (8+7)-(6+7);  EAX * 256 y a fixed point.
  184.                 POP     EBX
  185.                  ADD     ESI, EAX       ;  ESI -> y3 * 320
  186.  
  187.         ;  El último bucle.
  188.  
  189.                 MOVZX   AX, b DS:[BP+12]  ;  Pillamos el color.
  190.                 MOV     AH, AL
  191.                 SHL     EAX, 16
  192.                 MOVZX   AX, b DS:[BP+12]
  193.                 MOV     AH, AL
  194.  
  195.      @@BucleW2: CMP     EDI, ESI
  196.                 JNB   @@FinBucle2       ;  Hasta que EDI>=ESI
  197.  
  198.                 PUSH    EDI             ;  Tenemos que guardar estos registros.
  199.                 PUSH    ECX
  200.                 SHR     ECX, 7
  201.                 SHR     EDI, 7
  202.         OverW2: NOP                     ;  2*NOP / SUB DI,CX
  203.                 NOP
  204.                 SHR     CX, 1
  205.                 JNC   @@NoDoble2
  206.                 STOSB
  207.     @@NoDoble2: SHR     CX, 1
  208.                 JNC   @@NoDoble2b
  209.                 STOSW
  210.     @@NoDoble2b:REP  STOSd              ;  Dibujamos 1 línea horizontal.
  211.                 POP     ECX
  212.                 POP     EDI
  213.  
  214.                 ADD     EDI, EBX        ;  Incrementamos valores
  215.                 SUB     ECX, EDX
  216.                 JMP   @@BucleW2
  217.         @@FinBucle2:
  218.                 POP     ES
  219.                 POPAD
  220.                 RET                     ;  Un bonito triangulo, no? :)
  221. FillTriangle    ENDP
  222.  
  223. Tri1    DW      0, 0, 320, 0, 320, 200
  224.         DB      4
  225. Tri2    DW      20, 60, 20, 30, 100, 40
  226.         DB      5
  227. Tri3    DW      310, 15, 170, 15, 170, 150
  228.         DB      6
  229. Tri4    DW      10, 150, 100, 190, 70, 170
  230.         DB      6
  231.  
  232. MainTriang      PROC
  233. ;                CALL    LiberaMEM
  234. ;                XOR     EAX, EAX
  235. ;                MOV     BX, 1
  236. ;                InicGRAPH
  237.                 mov     ax, 13h
  238.                 int     10h
  239.                 MOV     AX, CS
  240.                 MOV     DS, AX
  241.  
  242.           mov eax,40          ; 40*250=10000 triangulos
  243. velocidad:      push eax
  244.  
  245.                 mov cs:[kk],0
  246.    @@otro:      mov     ax, cs:[kk]
  247. ;                mov     cs:[tri1+12], ax
  248.                 mov     cs:[tri2+12], ax
  249. ;                mov     cs:[tri3+12], ax
  250. ;                mov     cs:[tri4+12], ax
  251.  
  252. ;                MOV     BX, Offset Tri1 ;  El triangulo 1
  253. ;                CALL    FillTriangle
  254.                 MOV     BX, Offset Tri2 ;  El triangulo 2
  255.                 CALL    FillTriangle
  256. ;                MOV     BX, Offset Tri3 ;  El triangulo 3
  257. ;                CALL    FillTriangle
  258. ;                MOV     BX, Offset Tri4 ;  El triangulo 4
  259. ;                CALL    FillTriangle
  260.  
  261.                 inc cs:[kk]
  262.                 cmp cs:[kk], 250
  263.                 jb  @@otro
  264.  
  265.                 pop eax
  266.                 dec eax
  267.                 jnz velocidad
  268.  
  269.         @@Espera:                       ;  Esperar un momento.
  270.                 IN      AL, 60h
  271.                 DEC     AL
  272. ;                JNZ   @@Espera
  273.  
  274. ;                EndGRAPH
  275.                 mov     ax, 3
  276.                 int     10h
  277.                 MOV     AX, 4C00h
  278.                 INT     21h             ;  Bye...
  279. MainTriang      ENDP
  280.                 END     MainTriang
  281.  
  282.